package thread.synchroCode;

import lombok.extern.slf4j.Slf4j;

// 交替输出A,B,C ，输出五次
public class _09PrintFiveTimes {
  // 使用Sync 实现交替输出五次，封装同一个打印方法，三个线程，，每个线程指挥打印某个具体值，然后控制变量值的修改

  // 每次调用这个方法，都需要循环固定次数

  public static void main(String[] args) {
    SyncFiveTime wn = new SyncFiveTime(1, 5);
    new Thread(()->{
      wn.printStr("a",1,2);
    }).start();

    new Thread(()->{
      wn.printStr("b",2,3);
    }).start();

    new Thread(()->{
      wn.printStr("c",3,1);
    }).start();

  }

  @Slf4j(topic = "asdfasdfasdf")
  static class SyncFiveTime{
    private int flag;
    private int loopNumber;

    public void printStr(String string, int waitFlag, int nextFlag){
      for (int i = 0; i < loopNumber; i++) {
        synchronized (this){
          while (flag != waitFlag){
            try {
              wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
          log.debug(string);
          try {
            Thread.sleep(200);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          flag = nextFlag;
          notifyAll();
        }
      }
    }

    public SyncFiveTime(int flag, int loopNumber) {
      this.flag = flag;
      this.loopNumber = loopNumber;
    }
  }












//
//  public static void main(String[] args) {
//    SyncWaitNotify wn = new SyncWaitNotify(1, 5);
//
//    new Thread(()-> {
//      wn.printStr("a",1,2);
//    }).start();
//
//    new Thread(()-> {
//      wn.printStr("b",2,3);
//    }).start();
//
//    new Thread(()-> {
//      wn.printStr("c",3,1);
//    }).start();
//
//  }
//
//
//  /*
//输出内容       等待标记     下一个标记
//   a           1             2
//   b           2             3
//   c           3             1
// */
//  @Slf4j(topic = "wuwuwuwu")
//  static class SyncWaitNotify{
//    private int flag;
//    private int loopNumber;
//
//    public void printStr(String str, int waitFlag, int nextFlag){
//      for (int i = 0; i < loopNumber; i++) {
//        synchronized (this) {
//          while (flag != waitFlag){
//            try {
//              this.wait();
//            } catch (InterruptedException e) {
//              e.printStackTrace();
//            }
//          }
//          log.debug(str);
//          flag = nextFlag;
//          this.notifyAll();
//        }
//      }
//    }
//
//    public SyncWaitNotify(int flag, int loopNumber) {
//      this.flag = flag;
//      this.loopNumber = loopNumber;
//    }
//  }
}
